home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Overload Trio 2
/
Shareware Overload Trio Volume 2 (Chestnut CD-ROM).ISO
/
dir39
/
disaster.zip
/
DISASTER.EXE
/
LEESMIJ.DOC
< prev
next >
Wrap
Text File
|
1991-10-01
|
28KB
|
613 lines
_______
____|__ | (R)
--| | |-------------------
| ____|__ | Association of
| | |_| Shareware
|__| o | Professionals
-----| | |---------------------
|___|___| MEMBER
Het programma dat hieronder wordt beschreven is gemaakt
door
Feico Nater Shareware,
Beukweg 24,
7556 DE Hengelo.
Dit programma wordt beschikbaar gesteld als shareware.
Wat is shareware? Het is software dat door de gebruikers
gecopieerd en uitgedeeld mag worden, maar ik, de auteur behoud
het auteursrecht. Misschien heeft u het programma voor een
laag bedrag `gekocht' van een bulletin-board en er voor
betaald, maar ik krijg daar geen cent van. Ik verwacht dat u
mij rechtstreeks betaalt, want ik verdien mijn levensonderhoud
met het maken van shareware.
Dus, als dit programma u bevalt en u besluit het te
gebruiken, dan wordt van u verwacht dat u een bedrag van 40
gulden (inclusief BTW) overmaakt op mijn rekening bij de
Postbank, nummer 96541. Helaas kan ik geen kredietkaarten
accepteren.
Waarom zou u registreren? Het kost u natuurlijk geld.
Maar ik zal u op de hoogte houden van verdere ontwikkelingen
en u krijgt het recht om nieuwere versies te bestellen voor de
prijs van porto en floppy. Tenslotte zal ik bereid zijn om
naar uw verlangens te luisteren.
En als het programma u niet bevalt? Dan kan u het
weggooien. Maar ongetwijfeld zal het idee van shareware u
bevallen, omdat u niet veel geld hoeft te betalen voor iets
dat achteraf toch tegenvalt.
Maar of u nu registreert of niet, u wordt aangemoedigd
dit systeem verder rond te delen. Geef copieën aan uw vrien-
den. De copieën die u ronddeelt moeten volledig en ongewij-
zigd zijn, maar gebruik van file-compressie is toegestaan. U
mag alleen een maximum van tien gulden vragen voor de floppy,
verpakking en verzending.
Over de auteur
Ik werk met computers sedert 1970. Ik heb een HBO-studie
in informatica voltooid. Daarna heb ik vele jaren gewerkt in
de defensie-industrie, en mijn collega's beschouwden mij als
de bekwaamste programmeur onder hen. Maar dank zij Gorbatsjov
(wat ik hem niet kwalijk kan nemen) ging het slechter met de
defensie-industrie. Sindsdien werk ik als shareware-auteur.
*******************************
* D I S A S T E R *
*******************************
Disaster is een interactieve disassembler voor de IBM-PC.
Een disassembler is niets bijzonders. Het programma DEBUG
wordt bij MSDOS geleverd en bevat een disassembler. Maar
DEBUG kent alleen de instructies van de 8086 en 8088. Verder
levert DEBUG geen coding die geschikt is om weer als input
voor een assembler te dienen.
Geen enkele disassembler maakt met één druk op de knop een
keurig assemblerprogramma. In tegendeel, het disassembleren
van een beetje programma is vele dagen werk.
De eenvoudigst denkbare disassembler werkt rechttoe-
rechtaan. Hij leest het machinetaalprogramma van voor tot
achter en vertaalt alles naar assembler-taal, ongeacht of het
code of data is.
Disaster werkt interactief. U kan het machinetaalprogramma
op uw gemak bekijken, labels en commentaar toevoegen, aangeven
wat code en wat data is. Het resultaat kan worden opgeborgen
om de volgende dag verder te kunnen gaan. Tenslotte maakt
DISASTER een correct assemblerprogramma.
Deze gebruiksaanwijzing is heel kort. Er is niet meer uit
te leggen. Kennis van de PC en de assembleertaal wordt echter
bekend verondersteld.
DEMONSTRATIE
U start DISASTER de eerste keer met het commando:
DISASTER
Er komt nu een foutmelding die u mag negeren. Op het scherm
verschijnt de prompt --> om aan te geven dat DISASTER uw
commando's verwacht.
Vervolgens leest u een programma in met het commando:
R naam.EXE
of:
R naam.COM
of:
R naam.SYS
Wil u iets disassembleren wat reeds in het geheugen staat,
dan is het commando:
R segmentadres.ROM
Nu moet u eerst aangeven dat uw programma als instructiecode
moet worden gedisassembleerd met het commando:
C Lstartlocation,I
Nu begint het disassembleren! Geef het commando
U Lstartlocation
wat resulteert in een stukje gedisassembleerd programma op het
scherm. Links verschijnen de adressen, daarnaast de
mnemonische code, en rechts (in kleur) de oorspronkelijke
machinetaal. Een groen blokje betekent dat er geen geldige
opcode werd gevonden. Voorvoegsels komen in geel, modrm-bytes
en sib-bytes in rood, overige bytes in groen.
Varianten op het U-commando zijn:
U adres disassembleer 20 regels vanaf adres
U adres,adres disassembleer van .. tot ..
U disassembleer volgende 20 regels
<return> idem
Adressen in commando's worden altijd hexadecimaal opgegeven.
In plaats van adressen kan u ook labels (zie hierna) opgeven.
LABELS
Alle adressen komen hexadecimaal op het scherm. Natuurlijk
wil u labels zien. Dat kan met het commando:
L adres,label
Een label moet, zoals gebruikelijk, met een letter beginnen.
Verder moet minstens een keer de letter G tot en met Z er in
voorkomen. De maximale lengte van een label is veertien
tekens.
Komt in een label geen van de letters G tot en met Z voor,
dan beschouwt DISASTER het als een hexadecimaal adres.
Wees voorzichtig met het gebruik van labels die met de
letter L beginnen. De functie die automatisch controls
genereert veronderstelt namelijk dat zo'n label bij
instructiecode staat.
Labels kunnen worden gebruikt in commando's. Het U commando
wordt dan bijvoorbeeld: U label,label.
Labels kunnen worden verwijderd met het commando:
L label,-
of, wat op het zelfde neerkomt:
L adres,-
Labels kunnen van naam worden veranderd met het commando:
L oude naam,nieuwe naam
Het is niet mogelijk twee labels op het zelfde adres te
definiëren.
Het maximale aantal labels is 4090.
CONTROLs
Niet alles wat u ziet is instructiecode. Er is ook data.
De disassembler kan echter het verschil niet zien. Bovendien
bestaat er code en data in soorten. U moet zelf aangeven wat
code en wat data is en welke soort het is. Dat gaat door
controls te zetten met het commando:
C adres,letter(s)
of, wat op het zelfde neerkomt:
C label,letter(s)
Een control kan worden verwijderd met:
C adres,-
of:
C label,-
Vanaf het aangegeven adres wordt gedisassembleerd volgens de
letter.
Die letter kan zijn:
B hexadecimale bytes
T tekst tussen quotes, voor zover mogelijk
W hexadecimale woorden
I instructiecode voor Intel chips
IV instructiecode voor NEC V20 of V30
IA instructiecode voor 80386 in protected mode met
een adreslengte van 32 bits.
IO instructiecode voor 80386 in protected mode met
een operandlengte van 32 bits.
IAO combinatie van IA en IO.
B, T en W zijn data-controls, de overige zijn code-controls.
Dit is een belangrijk onderscheid voor de verderop besproken
A- en B-commando's.
De controls delen uw programma in stukken. Er zijn
datastukken en codestukken.
Als DISASTER een opcode tegenkomt die geldig is op NEC-chips
maar niet op Intel-chips, of andersom, dan wordt die gewoon
gedisassembleerd. Of I of IV werd opgegeven is dan niet van
belang. Maar er zijn opcodes die bij NEC en Intel iets anders
betekenen. In dat geval beslist I of IV. Programma's waarbij
het onderscheid tussen I en IV belangrijk is zijn overigens
zeldzaam.
IA en IO kunnen alleen worden gebruikt bij programma's die
op de 80386 in protected mode draaien. In real mode geldt
immers altijd een default-adres- en -operand-lengte van 16
bits.
Het maximale aantal controls is 16380.
INITIEEL OPGEVOERDE LABELS EN CONTROLS
Leest u een file in, dan worden automatisch wat labels en
controls bij de velden van de header gezet. De meeste labels
beginnen met de letter Z. Er is ook een label met de naam
LSTARTLOCATION, en dat is de plaats waar de executie begint.
In het grootste deel van uw programma geldt een T-control.
Dat mag vreemd lijken, maar het is gedaan omdat nog niet
bekend is waar de overige controls moeten staan.
AUTOMATISCH GENEREREN VAN LABELS
Het handmatig plaatsen van de labels en controls is een
enorm karwei. Daarom is dit werk in DISASTER gedeeltelijk
geautomatiseerd.
Labels worden automatisch gegenereerd met het commando:
A adres,adres
DISASTER doorzoekt nu uw programma, en geeft tegelijk een
listing op het scherm. Alleen de codestukken worden
onderzocht, datastukken worden overgeslagen. Elke keer als
DISASTER een adresverwijzing tegenkomt wordt hiervoor een
label opgevoerd.
Zo'n opgevoerd label heeft de vorm: L45A3_27E5.
De eerste letter van het opgevoerde label geeft het soort
verwijzing aan:
L spronginstructie
W woorddata
T bytedata
Na die eerste letter komt het hexadecimale adres waar het
label naar verwijst, want het kind moet een naam hebben.
Daarna een onderstreping, en ten slotte het adres waar de
verwijzing voor het eerst werd aangetroffen. Dat laatste
vergemakkelijkt het onderzoek van het programma.
Elke keer als een label wordt opgevoerd toont DISASTER een
blokje op het scherm. Zo'n blokje komt dus te staan bij
iedere JMP- en CALL-instructie en bij iedere
geheugenverwijzing waar nog geen label aanwezig is.
AUTOMATISCH GENEREREN VAN CONTROLS
Controls worden automatisch gegenereerd met het commando
B adres,adres
DISASTER doorzoekt nu de labels van uw programma. Elke keer
als DISASTER in een datastuk een label tegenkomt dat met een L
begint wordt hier een control I opgevoerd, zodat de verdere
programmatekst als instructiecode wordt geïnterpreteerd. Bij
de eerstvolgende onvoorwaardelijke RET- of JMP-instructie
wordt een control opgevoerd om de oorspronkelijke toestand te
herstellen.
Elke keer als een control wordt opgevoerd toont DISASTER een
blokje op het scherm. Zo'n blokje komt dus:
1 bij een label dat met een L begint en dat in een
datagebied stond.
2 bij de eerste RET- of JMP-instructie daarna.
Elke keer als een control I wordt opgevoerd, wordt bovendien
het betreffende stuk doorzocht naar adresverwijzingen, waar
dan (zoals in het vorige hoofdstuk stond) labels voor worden
gegenereerd.
AANWIJZINGEN
Meestal begint een disassembly aldus:
C:\disaster Start DISASTER
--->Rprogr.com lees het programma
--->B100,ffff genereer labels en controls
--->B100,ffff
--->B100,ffff
--->B100,ffff
Op het scherm ziet u hoe steeds meer labels worden geplaatst
en hoe steeds meer code-controls worden gezet.
Het commando B100,ffff kan eenvoudig worden herhaald met de
F3-toets. Herhaal het tot DISASTER meldt dat er niet meer
labels en controls zijn toegvoegd.
Als het een beetje wil is de disassembly hiermee al haast
voltooid, en u hoeft er niets voor te doen! Kom daar eens om
bij een andere disassembler.
Kan er dan niets foutgaan? Helaas, niets is volmaakt,
bijvoorbeeld in de volgende gevallen:
0150 JNZ L0123
0152 JZ L0156
0154 ADD B[BX+SI],AL
Het B-commando denkt dat de laatste instructie code is, want
er staat geen onvoorwaardelijke sprongopdracht voor. Maar JNZ
en JZ zijn samen onvoorwaardelijk. De coding vanaf adres 0154
zal dus als instructiecode worden beschouwd. Komen hier
dingen voor die lijken op instrcties met adresverwijzingen,
dan worden er valse labels gegenereerd.
Als u oplet tijdens de uitvoering van het B-commando, dan
zal u dit onheil wel opmerken. Onderbreek het commando met
een willekeurige toets, blader met het U-commando door het
programma om de juiste plek te vinden en zet op adres 0154 een
data-control.
INT 020
Dit is het einde van het programma, wat trouwens ook geldt
voot INT 021 met AH=00 of 04C. Het B-commando herkent dit
niet. U moet zelf hierachter een data-control zetten.
JMP [08170+BX]
Dit is een sprong via een tabel van sprongadressen. Dit
wordt door DISASTER niet herkend. U moet zelf labels
toekennen aan de adressen in de tabel. Gebruikt u labels die
met een L beginnen, dan zal het B-commando de gelabelde tekst
als code beschouwen.
COMMENTAAR
U kan commentaar toevoegen met het commando:
;adres,tekst
en natuurlijk ook met
;label,tekst
Let op de kommapunt die dit commando inluidt!
Commentaar kan worden verwijderd met:
;adres,-
of:
;label,-
De maximale lengte van een commentaarregel is 127 bytes.
Er kunnen geen twee commentaarregels op een adres staan.
De maximale hoeveelheid commentaar is ongeveer 62500 bytes,
plus wat overhead.
Verder zal u, natuurlijk, de gegenereerde labels vervangen
door namen die duidelijk aangeven wat er gebeurt.
MAKEN VAN EEN SOURCE-FILE
Het uiteindelijke doel van disassembleren is dat er een
source-file ontstaat. Deze source-file kan met een assembler
weer geassembleerd worden. De source-file wordt geopend met
het commando
W
De source-file heeft de zelfde naam als de .SYS-, .EXE- of
.COM-file, doch met de extensie .8.
Zolang de source-file open is is de prompt >>>. Alleen de
commando's U en Q zijn nu toegestaan.
Na het commando W geeft u een of meer U-commando's. Op het
scherm komen nu alleen nog maar de adressen, de
gedisassembleerde tekst gaat naar de file.
Tenslotte sluit u de file met het commando
Q
Nu verschijnt weer de prompt -->.
Wellicht verwacht u dat u, door de source-file weer te
assembleren, weer de zelfde .COM- of .EXE-file terugkrijgt.
In de praktijk zal dat tegenvallen, omdat meerdere machine-
instructies de zelfde functie hebben. Bijvoorbeeld:
MOV AX,BX 8BC3 of 89D8
REP MOVSB F3A4 of F2A4
ADD BX,5 83C305 of 81C30500
JMP $+8 EB06 of E90500
Verder zijn er instructies denkbaar die voor de processor
niet uitvoerbaar zijn, zoals SHL AL,30 of BOUND AX,BX.
DISASTER accepteert zulke instructies, de assembler zal ze
misschien weigeren.
HULP
Hulpschermen zijn beschikbaar met de toetsen F5 tot en met
F10. F1 en F3 zijn dus vrij om commando's geheel of
gedeeltelijk te herhalen.
Een hulpscherm wordt met een willekeurige toets verwijderd.
Druk liever niet op de hulptoetsen terwijl DISASTER met een
opdracht bezig is, het heeft enigszins vreemde (geen ernstige)
gevolgen.
STOPPEN EN VERDERGAAN
U heeft na vele uren werk uw programma uitgebreid met Labels
en Controls. Om de volgende dag verder te kunnen gaan geeft u
het commando:
S
Er wordt nu een zogenaamde scriptfile gemaakt. Deze heeft
de extensie .SCR en, als u geen andere naam opgaf, dezelfde
naam als uw programma.
Bestaat de scriptfile al, dan vraagt DISASTER om
bevestiging.
Tenslotte stopt u met het commando:
Q
Is er nog geen scriptfile gemaakt, dan vraagt DISASTER om
bevestiging.
Om verder te gaan start u de disassembler met het commando
DISASTER filenaam
waarbij u de naam van de scriptfile opgeeft. DISASTER
onderzoekt namelijk eerst of de opgegeven filenaam een
scriptfile is. Is dat niet het geval, dan zoekt DISASTER een
.COM- of .EXE-file.
Een scriptfile is een ASCII-file en bevat gewone commando's
voor de disassembler. Niets verbiedt u de scriptfile met een
teksteditor te bewerken.
OVERZICHT VAN DE 80386-CODE
D: richting. Als dit bit 1 is, dan is het datatransport in
omgekeerde richting
W: woord. Als dit bit 1 is, dan is de data 16 (of 32) bits
(anders 8).
S: sign-extend. Als dit bit 1 is, dan is de brondata 8 bits,
waarvan het hoogste bit gepropageerd wordt.
M: mod/rm-byte
I: immediate data
hexadecimaal
binair mnemonisch
00 M 0000 00dw ADD memory,register
04 I 0000 010w ADD register,immediate
06 0000 0110 PUSH ES
07 0000 0111 POP ES
08 M 0000 00dw OR memory,register
0C I 0000 010w OR register,immediate
0E 0000 0110 PUSH CS
0F 0000 0111 Zie verderop
10 M 0000 00dw ADC memory,register
14 I 0000 010w ADC register,immediate
16 0000 0110 PUSH SS
17 0000 0111 POP SS
18 M 0000 00dw SBB memory,register
1C I 0000 010w SBB register,immediate
1E 0000 0110 PUSH DS
1F 0000 0111 POP DS
20 M 0000 00dw AND memory,register
24 I 0000 010w AND register,immediate
26 0000 0110 ES: prefix
27 0000 0111 DAA
28 M 0000 00dw SUB memory,register
2C I 0000 010w SUB register,immediate
2E 0000 0110 CS: prefix
2F 0000 0111 DAS
30 M 0000 00dw XOR memory,register
34 I 0000 010w XOR register,immediate
36 0000 0110 SS: prefix
37 0000 0111 AAA
38 M 0000 00dw CMP memory,register
3C I 0000 010w CMP register,immediate
3E 0000 0110 DS: prefix
3F 0000 0111 AAS
40 0100 0rrr INC wordregister
48 0100 1rrr DEC wordregister
50 0101 drrr PUSH, POP wordregister
60 0110 000d PUSHA, POPA
62 M 0110 0010 BOUND wordregister,memory
63 M 0110 0011 ARPL memory,wordregister
64 0110 0100 80386 FS: prefix, NEC REPNC
65 0110 0101 80386 GS: prefix, NEC REPC
66 0110 0110 80386 OS prefix
67 0110 0111 80386 AS prefix
68 I 0110 10s0 PUSH immediate
69 M I 0110 10s1 IMUL register,memory,immediate
6C 0110 11dw INS, OUTS
70 I 0111 cccc J voorwaardelijk
80 M/0 1000 00sw ADD memory,immediate
80 M/1 1000 00sw OR memory,immediate
80 M/2 1000 00sw ADC memory,immediate
80 M/3 1000 00sw SBB memory,immediate
80 M/4 1000 00sw AND memory,immediate
80 M/5 1000 00sw SUB memory,immediate
80 M/6 1000 00sw XOR memory,immediate
80 M/7 1000 00sw CMP memory,immediate
82 1000 0010 niet gedefinieerd
84 M 1000 010w TEST memory,register
86 M 1000 011w XCHG memory,register
88 M 1000 10dw MOV memory,register
8C M 1000 11d0 MOV memory,segmentregister
8D M 1000 1101 LEA wordregister,memory
8F M/0 1000 1111 POP memory
90 1001 0rrr XCHG AX,wordregister
98 1001 100w CBW, CWD
9A I 1001 1010 CALL intersegment
9B 1001 1011 WAIT
9C 1001 110d PUSHF, POPF
9E 1001 111d SAHF, LAHF
A0 M 1010 00dw MOV register,memory
A4 1010 010w MOVS
A6 1010 011w CMPS
A8 I 1010 100w TEST AL,immediate, TEST
AX,immediate
AA 1010 101w STOS
AC 1010 110w LODS
AE 1010 111w SCAS
B0 I 1011 wrrr MOV register,immediate
C0 M/0 I 1100 000w ROL memory,immediate
C0 M/1 I 1100 000w ROR memory,immediate
C0 M/2 I 1100 000w RCL memory,immediate
C0 M/3 I 1100 000w RCR memory,immediate
C0 M/4 I 1100 000w SHL memory,immediate
C0 M/5 I 1100 000w SHR memory,immediate
C0 M/6 I 1100 000w niet gedefinieerd
C0 M/7 I 1100 000w SAR memory,immediate
C2 I 1100 0010 RET immediate
C3 1100 0011 RET
C4 M 1100 0100 LES wordregister,memory
C5 M 1100 0101 LDS wordregister,memory
C6 M/0 I 1100 011w MOV memory,immediate
C6 M/1 e.v Niet gedefinieerd
C8 I I 1100 1000 ENTER word,byte
C9 1100 1001 LEAVE
CA I 1100 1010 RETF word
CB 1100 1011 RETF
CC 1100 1100 INT 3
CD I 1100 1101 INT byte
CE 1100 1110 INTO
CF 1100 1111 IRET
D0 M/0 1101 000w ROL memory,1
D0 M/1 1101 000w ROR memory,1
D0 M/2 1101 000w RCL memory,1
D0 M/3 1101 000w RCR memory,1
D0 M/4 1101 000w SHL memory,1
D0 M/5 1101 000w SHR memory,1
D0 M/6 1101 000w niet gedefinieerd
D0 M/7 1101 000w SAR memory,CL
D2 M/0 1101 001w ROL memory,CL
D2 M/1 1101 001w ROR memory,CL
D2 M/2 1101 001w RCL memory,CL
D2 M/3 1101 001w RCR memory,CL
D2 M/4 1101 001w SHL memory,CL
D2 M/5 1101 001w SHR memory,CL
D2 M/6 1101 001w niet gedefinieerd
D2 M/7 1101 001w SAR memory,CL
D4 I 1101 0100 AAM
D5 I 1101 0101 AAD
D6 1101 0110 ongedefinieerd
D7 1101 0111 XLAT
D8 M/0 1101 1000 FADD dword
D8 M/1 1101 1000 FMUL dword
D8 M/2 1101 1000 FCOM dword
D8 M/3 1101 1000 FCOMP dword
D8 M/4 1101 1000 FSUB dword
D8 M/5 1101 1000 FSUBR dword
D8 M/6 1101 1000 FDIV dword
D8 M/7 1101 1000 FDIVR dword
D8 C0 1101 1000 FADD 0,i
D8 C8 1101 1000 FMUL 0,i
D8 D0 1101 1000 FCOM 0,i
D8 D8 1101 1000 FCOMP 0,i
D8 E0 1101 1000 FSUB 0,i
D8 E8 1101 1000 FSUBR 0,i
D8 F0 1101 1000 FDIV 0,i
D8 F8 1101 1000 FDIVR 0,i
D9 M/0 1101 1001 FLD dword
D9 M/1 1101 1001 niet gedefinieerd
D9 M/2 1101 1001 FST dword
D9 M/3 1101 1001 FSTP dword
D9 M/4 1101 1001 FLDENV dword
D9 M/5 1101 1001 FLDCW dword
D9 M/6 1101 1001 FSTENV dword
D9 M/7 1101 1001 FSTCW dword
D9 C0 1101 1001 FLD i
D9 C8 1101 1001 FXCH 0,i
D9 D0 1101 1001 FNOP
D9 D1 e.v. 1101 1001 niet gedefinieerd
D9 E0 1101 1001 FCHS
D9 E1 1101 1001 FABS
enz.
D9 FF 1101 1001 FCOS